package com.xuecheng.manage_media_process.mq;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xuecheng.framework.domain.media.MediaFile;
import com.xuecheng.framework.domain.media.MediaFileProcess_m3u8;
import com.xuecheng.framework.utils.HlsVideoUtil;
import com.xuecheng.framework.utils.Mp4VideoUtil;
import com.xuecheng.manage_media_process.dao.MediaFileRepository;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Optional;

@Component
public class MediaProcessTask {

    @Autowired
    MediaFileRepository mediaFileRepository;
    //ffmpeg命令的绝对路径
    @Value("${xc-service-manage-media.ffmpeg-path}")
    String ffmpeg;
    //上传文件所在的路径
    @Value("${xc-service-manage-media.video-location}")
    String serverPath;
    //视频处理
    //将avi文件转换为MP3文件
    @RabbitListener(queues = "${xc-service-manage-media.mq.queue-media-video-processor}",containerFactory = "customContainerFactory")
    public void receiveMediaProcessTask(String msg){
            //获取消息Id
        JSONObject jsonObject = JSON.parseObject(msg);
        String mediaId = (String) jsonObject.get("mediaId");
        //解析消息
        Optional<MediaFile> optional = mediaFileRepository.findById(mediaId);
        if(!optional.isPresent()){
            return;
        }
        //获取文件信息
        MediaFile mediaFile = optional.get();
        //获取文件类型
        String fileType = mediaFile.getFileType();
        if(mediaFile==null || !fileType.equals("avi")){
            mediaFile.setFileStatus("303004");//无须处理
            mediaFileRepository.save(mediaFile);
            return;
        }else {
            mediaFile.setFileStatus("303001");
            mediaFileRepository.save(mediaFile);
        }
        //生成MP4
        //获取源文件的路径
        String video_path=serverPath+mediaFile.getFilePath()+mediaFile.getFileName();
        //设置mp4文件名称
        String mp4_name=mediaFile.getFileId()+".mp4";
        //设置mp4保存路径
        String mp4_path=serverPath+mediaFile.getFilePath();
        Mp4VideoUtil mp4VideoUtil = new Mp4VideoUtil(ffmpeg,video_path,mp4_name,mp4_path);
        String result = mp4VideoUtil.generateMp4();
        if(result==null|| !result.equals("success")){
            mediaFile.setProcessStatus("303003");
            MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
            mediaFileProcess_m3u8.setErrormsg(result);
            mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
            mediaFileRepository.save(mediaFile);
            return;
        }

        //生成m3u8文件
        //获取MP4的文件地址
         video_path=serverPath+mediaFile.getFilePath()+mp4_name;
        //设置m3u8名字
        String m3u8_name=mediaFile.getFileId()+".m3u8";
        //设置m3u8的文件地址
        String m3u8_path=serverPath+mediaFile.getFilePath()+"hls/";
        HlsVideoUtil hlsVideoUtil = new HlsVideoUtil(ffmpeg, video_path, m3u8_name, m3u8_path);
        String generateM3u8 = hlsVideoUtil.generateM3u8();
        if(generateM3u8==null || !generateM3u8.equals("success")){
            mediaFile.setProcessStatus("303003");
            MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
            mediaFileProcess_m3u8.setErrormsg(result);
            mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
            mediaFileRepository.save(mediaFile);
            return;
        }
        //获取m3u8列表
        List<String> ts_list = hlsVideoUtil.get_ts_list();
        //更新状态为成功
        mediaFile.setProcessStatus("303002");
        MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
        mediaFileProcess_m3u8.setTslist(ts_list);
        mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
        //m3u8的url
        mediaFile.setFileUrl(mediaFile.getFilePath()+"hls/"+m3u8_name);
        mediaFileRepository.save(mediaFile);


    }
}
